package cn.demoncat.util.redis.util;

import cn.demoncat.util.lang.constant.LongConstant;
import cn.demoncat.util.redis.config.RedisIsolator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * Redis Map处理工具
 *
 * @author 延晓磊
 * @since 2021年02月13日
 */
@Component
public class RedisMapUtil {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private RedisIsolator redisIsolator;

    /**
     * 获取Redis Map，不存在时创建
     *
     * 添加元素		put(k,v)
     * 不存在时添加	putIfAbsent(k, v)
     * 获取元素		get(k)
     * 删除元素		delete(k)
     * 查看集合		entries()
     * 是否包含元素	hasKey(k)
     *
     * @param hkey  Hash Key
     * @return
     *
     * @author 延晓磊
     * @since 2021年02月10日
     */
    public BoundHashOperations<String, String, String> map(String hkey){
        return stringRedisTemplate.boundHashOps(redisIsolator.getKey(hkey));
    }

    /**
     * 获取元素
     *
     * @param hkey
     * @param key
     *
     * @return
     *
     * @author 延晓磊
     * @since 2021年02月10日
     */
    public String get(String hkey, String key){
        // Hash > 获取
        return map(hkey).get(key);
    }

    /**
     * 删除元素
     *
     * @param hkey
     * @param key
     *
     * @return
     *
     * @author 延晓磊
     * @since 2021年02月10日
     */
    public boolean delete(String hkey, String key){
        // Hash > 删除
        return LongConstant.N1.equals(map(hkey).delete(key));
    }

    /**
     * 添加元素
     *
     * @param hkey
     * @param second
     * @param key
     * @param value
     *
     * @author 延晓磊
     * @since 2021年02月10日
     */
    public void put(String hkey, Integer second, String key, String value){
        // Hash
        BoundHashOperations<String, String, String> map = map(hkey);
        // 保存
        map.put(key, value);
        // 过期时间
        if (second != null && second > 0) {
            map.expire(second, TimeUnit.SECONDS);
        }
    }

    /**
     * 添加元素
     *
     * @param hkey
     * @param key
     * @param value
     *
     * @author 延晓磊
     * @since 2021年02月10日
     */
    public void put(String hkey, String key, String value){
        put(hkey, null, key, value);
    }
}
